
import math

# const
Kelvins=273.15
TEMPERATURE_B=3750.0
R_T_ref=5100.0
R0=10000.0
T0=25.0

R_H_ref=51000.0

# 不能用 adc 的值判断 因为没有校准!!!
# 不能用 adc 的值判断 因为没有校准!!!
# 不能用 adc 的值判断 因为没有校准!!!

#// 热量公式 $$ ΔQ=C*m*ΔT; m=ρV $$ ; 假设不同温度时: ρ,C恒定 $$ΔV_1*ΔT_1=ΔV_2*ΔT_2$$    
def calculate_t(adc):
    # temperature
    # int cal_t(int adc, int *R)


    # 计算 R
    # 校准曲线 k*x+b ; r>1000 ,-1000因为串联了一个1k电阻
    #  已校准 1k-40k ,R^2=0.9999
    R = (R_T_ref * (4095 - adc) / (adc + 1)) * 1.1042 + 902.7 - 1000

    if R > 200000:
        #   //开路 r=无限
        # 开路
        return R, -999
    elif R > 100000:
        # -20度  r=100k
        # 温度过低 < -20摄氏度
        return R, -99
    elif R <= 10:
        # 短路
        return R, 999
    elif R < 300:
        return R, 998
    elif R < 600:
        #  100度 r=700~800 ,取100多度的 700
        # 温度过高! > 100 摄氏度
        return R, 120

    t = 1.0 / (1.0 / (T0 + Kelvins) - 1.0 / TEMPERATURE_B * math.log(R0 / R)) - Kelvins
    return R, t



H_COMPARE_COUNTS=7
# 水电阻 修正
RRR_WATER=0
RRR_WATER=500
H_compares=[10000, 20000, 30000, 40000, 65000, 70000]
# xk==4 1xk==3 2xk==2 3xk==1 5x|6xk==0
# 自来水电阻 大概有 5k~7k  ,
H_compare_results= [4, 3, 2, 1, 0, -888, -999]

#heigth
def calculate_h(adc1,adc2):
    # int cal_h(int adc1, int adc2, int *R)
    # adc1+adc2 ~= 4700  // 出现了大于6500的情况.. 但R的值是正常的.  出现的比较少, 但它存在
    # if (adc1 + adc2 < 2000 || adc1 + adc2 > 6500 ) // 出现了大于6500的情况.. 但R的值是正常的.
    #   所以 不做adc1+adc2的范围界定.  只做adc本身的范围界定.
    # return R,h  # 电阻, 水位
    if adc1 < 0 or adc2 < 0 or adc1 > 4096 or adc2 > 4096:
        return -9999,-99

    #  -10000 因为串联了一个10k电阻  // 注意是k,  要 -> *1000
    #  当短路时  r测得adc1|2,计算出来约等于 1k(~900)
    R = (R_H_ref * (adc1 + 0.0001) / (adc2 + 0.0001)) * 0.9702 + 1580.1 - 10000 + RRR_WATER

    for i in range(len(H_compares)):
        if R < H_compares[i]:
            return R,H_compare_results[i]
    return R, H_compare_results[-1]

